from flask import Flask, render_template, request
import pandas as pd
import cufflinks as cf
import plotly as py
import plotly.graph_objs as go

app = Flask(__name__)


# 读数据
def read_data():
    return pd.read_csv("hurun_unicorn.tsv",
                       sep="\t",
                       engine="python",
                       encoding="utf8",
                       header=0,
                       )


df = read_data()
df.index.name = "序号"
# 筛选数据目标（处理数据）
#筛选欧盟地区
欧盟国家=["法国","德国","意大利","荷兰","比利时","卢森堡","爱尔兰","英国","丹麦","希腊","西班牙","葡萄牙","芬兰","瑞典","奥地利","爱沙尼亚","拉脱维亚","立陶宛","波兰","捷克","匈牙利","斯洛伐克","斯洛文尼亚","马耳他","塞浦路斯","罗马尼亚","保加利亚"]
欧盟地区=df[df['国家'].isin(欧盟国家)]


# 从估值、企业数量和行业分布进行统计
欧盟地区[['国家','城市','企业名称','估值（亿人民币）','行业']]\
.groupby(['国家','行业'])\
.agg({'估值（亿人民币）':'sum','企业名称':'count'})\
.sort_values(['估值（亿人民币）','企业名称'],ascending=False)\
.rename ( columns = {"企业名称":"企业数量"} )

欧盟数据=欧盟地区[['国家','城市','企业名称','估值（亿人民币）','成立年份','行业']]\
.groupby(['国家','城市','成立年份','行业'])\
.agg({'估值（亿人民币）':"sum",'企业名称':'count'})\
.sort_values(['估值（亿人民币）','企业名称'],ascending=False)\
.rename(columns = {"企业名称":"企业数量"})\
.reset_index()

# 估值发展趋势
欧盟估值数据=欧盟数据.groupby(['国家','成立年份'])\
.agg({"估值（亿人民币）":"sum","估值（亿人民币）":"max","估值（亿人民币）":"min"})\
.reset_index()\
.pivot(index="国家",columns="成立年份", values=["估值（亿人民币）"])

亚太国家=["中国","日本","韩国","朝鲜","菲律宾","马来西亚","印度尼西亚","新加坡","澳大利亚","新西兰"]
亚太地区=df[df['国家'].isin(亚太国家)]
# 从估值、企业数量和行业分布进行统计
亚太地区[['国家','城市','企业名称','估值（亿人民币）','行业']]\
.groupby(['国家','行业'])\
.agg({'估值（亿人民币）':'sum','企业名称':'count'})\
.sort_values(['估值（亿人民币）','企业名称'],ascending=False)\
.rename ( columns = {"企业名称":"企业数量"} )

亚太数据=亚太地区[['国家','城市','企业名称','估值（亿人民币）','成立年份','行业']]\
.groupby(['国家','城市','成立年份','行业'])\
.agg({'估值（亿人民币）':"sum",'企业名称':'count'})\
.sort_values(['估值（亿人民币）','企业名称'],ascending=False)\
.rename(columns = {"企业名称":"企业数量"})\
.reset_index()

# 估值发展趋势
亚太估值数据=亚太数据.groupby(['国家','成立年份'])\
.agg({"估值（亿人民币）":"sum","估值（亿人民币）":"max","估值（亿人民币）":"min"})\
.reset_index()\
.pivot(index="国家",columns="成立年份", values=["估值（亿人民币）"])
亚太估值数据

# 首页，展示数据处理后的全部数据
@app.route('/entry')
def category() -> 'html':
    # 筛选数据目标（处理数据）
    df_欧盟 = 欧盟数据.to_html()
    
    return render_template("results2.html",
                           category_all_list=res,
                           the_res= df_all,
                           )

# 展示数据筛选后的数据和图表
@app.route('/hurun',methods=['POST'])

    # 欧盟数据.iplot(kind="bar", x=["国家"], y="估值（亿人民币）",color='#cc0000', asFigure=True)
    # 亚太数据.iplot(kind="bar", x=["国家"], y="估值（亿人民币）",color='blue', asFigure=True)
df_中国=df[df['国家'].isin(['中国'])]

df_城市统计=df_中国[['城市','企业名称','估值（亿人民币）','行业']]\
                .groupby(['城市','行业'])\
                .agg({'估值（亿人民币）':'sum','企业名称':'count'})\
                .sort_values(['估值（亿人民币）','企业名称'],ascending=False)\
                .reset_index()
df_城市统计.rename(columns={ '企业名称':'企业数量'}, inplace = True)
df_城市统计.iplot(kind="bar", x="城市", y="估值（亿人民币）",color="#238E68", asFigure=True)
企业估值=pd.DataFrame({"企业名称":df_中国["企业名称"]
                              ,"估值":df_中国["估值（亿人民币）"]})
fig=px.pie(企业估值,values="估值",names="企业名称",title="中国独角兽企业估值情况",template="seaborn")
fig.update_traces(textposition="inside",textinfo="value+percent+label")#标签位置放在里面，标签信息包含值，百分比，标签
fig.show()
py.offline.plot(fig, filename="中国独角兽企业估值情况.html",auto_open=False)
with open("中国独角兽企业估值情况.html", encoding="utf8", mode="r") as f:
    plot_all1 = "".join(f.readlines())


企业估值=pd.DataFrame({"企业名称":df_中国["企业名称"]
                              ,"估值":df_中国["估值（亿人民币）"]})
企业估值分析=企业估值.sort_values(by=["估值"],ascending=False)[:20]
plt.figure(figsize=(12,8))
ax=sns.catplot(x="企业名称",
            y="估值",
            data=企业估值分析,
            kind="bar",aspect=2.5)
plt.xlabel(xlabel="企业名称",fontsize=14)     # 设置x轴
plt.ylabel(ylabel="估值",fontsize=14)     # 设置y轴
ax.set_xticklabels(rotation=45,fontsize=14)     # 设置大小
ax.set_yticklabels(fontsize=14)
plt.title('中国估值最高的20个企业',fontsize=16,pad=20)
plt.show()

# py.offline.plot(企业估值,filename="中国估值最高的20个企业.html",auto_open=False)
with open("中国估值最高的20个企业.html", encoding="utf8", mode="r") as f:
    plot_all = "".join(f.readlines())

企业估值=pd.DataFrame({"企业名称":df_中国["企业名称"]
                              ,"估值":df_中国["估值（亿人民币）"]
                              ,"行业":df_中国["行业"]})

企业估值分析=企业估值.groupby(['行业','企业名称'])\
.agg({'估值':'sum'})\
.sort_values(['估值'],ascending=False)[:50]
企业估值分析=企业估值分析.reset_index()

企业估值分析.iplot(kind="bar", x="行业", y="估值",color="#238E68", asFigure=True)














    # 交互式可视化画图
    fig = 地区行业数据.iplot(kind="bar", x="行业", y="估值（亿人民币）", asFigure=True)
    py.offline.plot(fig,  filename="example.html",auto_open=False)
    with open("example.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
    data_str = 地区行业数据.to_html()
    return render_template('results2.html',
                            the_plot_all = plot_all,
                            the_res = data_str,
                            category_all_list=res,
                           )

# 中国城市独角兽企业估值情况
@app.route('/Chinese cities')
# 视图函数
def get_Chinese_cities():
    中国 = df[df['国家'].isin(['中国'])]
    城市情况 = 中国[['城市', '企业名称', '估值（亿人民币）', '成立年份', '行业','掌门人/创始人','部分投资机构']].groupby(['城市', '行业', '成立年份','掌门人/创始人','部分投资机构']).agg(
        {'估值（亿人民币）': 'sum', '企业名称': 'count'}).sort_values(['估值（亿人民币）', '企业名称'], ascending=False).rename(
        columns={"企业名称": "企业数量"}).reset_index()
    fig = 城市情况.iplot(kind="bar", x="城市", y="估值（亿人民币）", asFigure=True)
    py.offline.plot(fig, filename="example.html", auto_open=False)
    with open("example.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
        data_str = 城市情况.to_html()
        return render_template('base.html',   # 要改html
                       the_plot_all=plot_all,
                       the_res=data_str,
                       )

@app.route('/entry2')
def choose() -> 'html':
    df = read_data()
    # 筛选目标
    国家=pd.unique(df['国家'])
    country_list = list(set(国家))
    行业 = pd.unique(df['行业'])
    industry_list = list(set(行业))
    成立年份 = pd.unique(df['成立年份'])
    time_list = list(set(成立年份))

    res1 = country_list
    res2 = industry_list
    res3 = time_list
    df_all = df.to_html(classes="pure-table", index=False)
    return render_template("results.html",
                           country_list=res1,
                           industry_list=res2,
                           time_list=res3,
                           the_res=df_all,
                           )

# 国家、行业、年份筛选器
@app.route('/Sifting',methods=['POST'])
def hurun_sifting() -> 'html':
    df = read_data()
    print(df)
    df[["成立年份"]] = df[["成立年份"]].astype(str)
    成立年份_list = df['成立年份'].tolist()
    print(成立年份_list)

    行业 = pd.unique(df['行业'])
    industry_list = list(set(行业))
    成立年份 = pd.unique(df['成立年份'])
    time_list = list(set(成立年份))
    国家 = pd.unique(df['国家'])
    country_list = list(set(国家))
    res1=country_list
    res2=industry_list
    res3=time_list
    country = request.form["countrylist"]
    industry= request.form["industrylist"]
    time= request.form["timelist"]
    print(country)  # 检查用户输入
    print(industry)
    print(time)
    df_choose = df[(df['国家'] == country) & (df['行业'] == industry) & (df['成立年份'] == time)]
    print(df_choose)


        # 交互式画图
    if country in country_list :
        df_choose = df[(df['国家'] == country) & (df['行业'] == industry) & (df['成立年份'] == time)]
        print(df_choose)
        fig = df_choose.iplot(kind="bar", x="城市", y="估值（亿人民币）", asFigure=True)
        py.offline.plot(fig,  filename="example.html",auto_open=False)

    with open("example.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
    data_str =df_choose.to_html(classes="pure-table", index=False)
    return render_template('results.html',
                           res = df_choose,
                           the_plot_all = plot_all,
                           the_res = data_str,
                           country_list=res1,
                           industry_list=res2,
                           time_list=res3,
                           )

if __name__ == '__main__':
            app.run(debug=True)




